home *** CD-ROM | disk | FTP | other *** search
/ ETO Development Tools 4 / ETO Development Tools 4.iso / Tools - Objects / MacApp / MacApp 2.0.1 / MacApp CD Release / MacApp® 2.0.1 Tutorial / Chapter 10 / UIconEdit.inc1.p < prev    next >
Text File  |  1990-10-25  |  11KB  |  390 lines

  1. {Copyright © 1989 by Apple Computer, Inc.  All rights reserved.}
  2.  
  3.  
  4.  
  5. CONST
  6.     kIconHBits =        32;                            { Number of horizontal bits in a bitmap.}
  7.     kIconVBits =        32;                            { Number of vertical bits in a bitmap.    }
  8.  
  9.     kIconSizeInBytes =    kIconHBits * kIconVBits DIV 8;    { Number of bytes in an bitmap.        }
  10.     kIconSizeInLongs =    kIconSizeInBytes DIV 4;        { Number of long words in a bitmap.        }
  11.     kMaxLong =            kIconSizeInLongs - 1;        { Max. addressable long word in bitmap.    }
  12.     
  13.     
  14.     { Resource identifiers }
  15.     
  16.     kSeedIconId =        1000;                        { Id of the seed icon resource.            }
  17.  
  18.     kIconWindowId =        1000;                        { Id of the icon window 'view' resource.}
  19.     kIconViewId =        1001;                        { Id of the TIconView resource.            }
  20.  
  21.     
  22.     { Constants for TIconView }
  23.  
  24.     kDefaultMagnification =    7;                        { Default icon magnification.            }
  25.     kBorder =                5;                        { Border in which to inset drawing.        }
  26.  
  27.  
  28.  
  29.  
  30. TYPE
  31.     LongArrayHdl =        ^LongArrayPtr;
  32.     LongArrayPtr =        ^LongArray;
  33.     LongArray =            ARRAY [0..kMaxLong] OF LONGINT;
  34.  
  35.  
  36.  
  37. {-------------------------------------------------------------------------------------------}
  38. {--------------------------------TIconApplication methods-----------------------------------}
  39. {-------------------------------------------------------------------------------------------}
  40.  
  41. PROCEDURE TIconApplication.IIconApplication(iconFileType: OSType);
  42.  
  43. VAR anIconView : TIconView;
  44.  
  45. BEGIN
  46.     IApplication(iconFileType);
  47.     
  48.     if gCreateWithTemplates then begin  { Make sure the linker doesn't strip out view code. }
  49.         New(anIconView);
  50.     end;
  51. END;
  52.  
  53.  
  54.  
  55. {-------------------------------------------------------------------------------------------}
  56.  
  57. FUNCTION  TIconApplication.DoMakeDocument(itsCmdNumber: CmdNumber): TDocument; OVERRIDE;
  58.  
  59. VAR
  60.     anIconDocument:        TIconDocument;
  61.  
  62. BEGIN
  63.     New(anIconDocument);                            { Create a TIconDocument object.        }
  64.     FailNIL(anIconDocument);                        { Make sure we were successful.            }
  65.     anIconDocument.IIconDocument;                    { Initialize it.                        }
  66.  
  67.     DoMakeDocument := anIconDocument;                { Return a reference to the document.    }
  68. END;
  69.     
  70.     
  71.     
  72.     
  73. {-------------------------------------------------------------------------------------------}
  74. {----------------------------------TIconDocument methods------------------------------------}
  75. {-------------------------------------------------------------------------------------------}
  76.  
  77. PROCEDURE TIconDocument.IIconDocument;
  78.  
  79. VAR anIconBitMap : TIconBitMap;
  80.  
  81. BEGIN
  82.     fIconBitMap := NIL;                                { Set this to NIL so that if IDocument    }
  83.                                                     { fails, TIconDocument.Free works okay.    }
  84.  
  85.     IDocument(kFileType,                             { This document's file type.            }
  86.               kSignature,                             { This document's creator.                }
  87.               kUsesDataFork,                         { This document does use the data fork    }
  88.               NOT kUsesRsrcFork,                    { …but doesn't use the resource fork.    }
  89.               NOT kDataOpen,                        { We don't want the data fork kept open    }
  90.               NOT kRsrcOpen);                        { …nor the resource fork.                }
  91.  
  92.     New(anIconBitMap);                                { Allocate a new icon bitmap.            }
  93.     FailNil(anIconBitMap);                            { Fail if we can't allocate the handle.    }
  94.     anIconBitMap.IIconBitMap;                        { Initialize it.                        }
  95.  
  96.     fIconBitMap := anIconBitMap;                    { Store a reference to it in a field.    }
  97. END;
  98.  
  99.  
  100.  
  101. {-------------------------------------------------------------------------------------------}
  102.  
  103. PROCEDURE TIconDocument.DoInitialState; OVERRIDE;
  104.     { This method is called to set the document's data to the "new" state, as when the user    }
  105.     { chooses to open a new document instead of an existing one.  We set the value of the     }
  106.     { document's icon bit map to that of a "seed" icon in our resource file.  That way we     }
  107.     { can the document's initial state simply by changing the "seed" icon resource.            }
  108.  
  109. VAR
  110.     seedIcon:        Handle;
  111.  
  112. BEGIN
  113.     seedIcon := GetIcon(kSeedIconId);                { Get the seed icon resource.            }
  114.     FailNilResource(seedIcon);
  115.     fIconBitMap.SetIconBitMap(seedIcon)
  116. END;
  117.  
  118.  
  119.  
  120. {-------------------------------------------------------------------------------------------}
  121.  
  122. PROCEDURE TIconDocument.Free; OVERRIDE;
  123.     
  124. BEGIN
  125.     FreeIfObject(fIconBitMap);                        { Dispose of the icon object if non-Nil.}
  126.  
  127.     INHERITED Free;
  128. END;
  129.  
  130.  
  131.  
  132. {-------------------------------------------------------------------------------------------}
  133.  
  134. PROCEDURE TIconDocument.DoMakeViews (forPrinting: BOOLEAN); OVERRIDE;
  135.  
  136. VAR
  137.     aWindow:  TWindow;
  138.  
  139. BEGIN
  140.     aWindow := NewTemplateWindow(kIconWindowId, SELF);        { Create the view hierarchy }
  141. END;
  142.  
  143.  
  144.     
  145. {-------------------------------------------------------------------------------------------}
  146.  
  147. PROCEDURE TIconDocument.Fields (PROCEDURE DoToField (fieldName: Str255;
  148.                                                    fieldAddr: Ptr;
  149.                                                    fieldType: INTEGER)); OVERRIDE;
  150.  
  151. BEGIN
  152.     DoToField('TIconDocument', NIL, bClass);
  153.     DoToField('fIconBitMap', @fIconBitMap, bObject);
  154.  
  155.     INHERITED Fields(DoToField);
  156. END;
  157.  
  158.  
  159. {-------------------------------------------------------------------------------------------}
  160. {------------------------------------TIconView methods--------------------------------------}
  161. {-------------------------------------------------------------------------------------------}
  162.  
  163.  
  164. PROCEDURE TIconView.IRes (itsDocument: TDocument; itsSuperView: TView; VAR itsParams: Ptr);
  165.  
  166. BEGIN
  167.     INHERITED IRes(itsDocument, itsSuperView, itsParams);
  168.  
  169.     fMagnification := kDefaultMagnification;
  170.     fIconDocument := TIconDocument(itsDocument);
  171. END;
  172.  
  173.  
  174.  
  175. {-------------------------------------------------------------------------------------------}
  176.  
  177. PROCEDURE TIconView.CalcMinSize (VAR minSize: VPoint); OVERRIDE;
  178.  
  179. BEGIN
  180.     minSize.h := kIconHBits * fMagnification + kBorder + kBorder;
  181.     minSize.v := kIconVBits * fMagnification + kBorder + kBorder;
  182. END;
  183.  
  184.  
  185.  
  186.  
  187. {-------------------------------------------------------------------------------------------}
  188.  
  189. PROCEDURE TIconView.Draw (area: Rect); OVERRIDE;
  190.  
  191. VAR
  192.     drawingRect:    Rect;
  193.  
  194. BEGIN
  195.     SetRect(drawingRect, kBorder, kBorder,
  196.                          kBorder + (kIconHBits * fMagnification),
  197.                          kBorder + (kIconVBits * fMagnification));
  198.  
  199.     fIconDocument.fIconBitMap.Draw(drawingRect);    
  200. END;
  201.  
  202.  
  203. {-------------------------------------------------------------------------------------------}
  204.  
  205. PROCEDURE TIconView.Fields (PROCEDURE DoToField (fieldName: Str255;
  206.                                                  fieldAddr: Ptr;
  207.                                                  fieldType: INTEGER)); OVERRIDE;
  208.                                                  
  209. BEGIN
  210.     DoToField('TIconView', NIL, bClass);
  211.     DoToField('fIconDocument', @fIconDocument, bObject);
  212.     DoToField('fMagnification', @fMagnification, bInteger);
  213.     
  214.     INHERITED Fields(DoToFIeld);
  215. END;
  216.  
  217.  
  218. {-------------------------------------------------------------------------------------------}
  219. {-----------------------------------TIconBitMap methods-------------------------------------}
  220. {-------------------------------------------------------------------------------------------}
  221.  
  222. PROCEDURE TIconBitMap.IIconBitMap;
  223.  
  224. BEGIN
  225.     fDataHandle := NewPermHandle(kIconSizeInBytes);    { Allocate a handle for the bitmap.        }
  226.     FailNil(fDataHandle);                            { Fail if we can't allocate the handle.    }
  227. END;
  228.  
  229.  
  230.  
  231. {-------------------------------------------------------------------------------------------}
  232.  
  233. PROCEDURE TIconBitMap.Free; OVERRIDE;
  234.  
  235. BEGIN
  236.     DisposIfHandle(fDataHandle);                    { dispose of icon data.                    }
  237. END;
  238.  
  239.  
  240.  
  241. {-------------------------------------------------------------------------------------------}
  242.  
  243. PROCEDURE TIconBitMap.SetIconBitMap(theBitMap : Handle);
  244.  
  245. BEGIN
  246.     BlockMove(theBitMap^, fDataHandle^,                { …then copy it into the document's     }
  247.                 kIconSizeInBytes)                    { …icon bitmap.                            }
  248. END;
  249.             
  250.             
  251.  
  252. {-------------------------------------------------------------------------------------------}
  253.  
  254. PROCEDURE TIconBitMap.Clear;
  255.  
  256. VAR
  257.     iconAsLongArray:    LongArrayHdl;
  258.     i:                    INTEGER;
  259.  
  260. BEGIN
  261.     iconAsLongArray := LongArrayHdl(fDataHandle);    { Cast to array of longints.            }
  262.  
  263.     FOR i := 0 TO kMaxLong DO                        { Clear the bits 32 at a time.            }
  264.         iconAsLongArray^^[i] := 0;
  265. END;
  266.  
  267.  
  268.  
  269. {-------------------------------------------------------------------------------------------}
  270.  
  271. PROCEDURE TIconBitMap.Invert;
  272.  
  273. VAR
  274.     iconAsLongArray:    LongArrayHdl;
  275.     i:                    INTEGER;
  276.  
  277. BEGIN
  278.     iconAsLongArray := LongArrayHdl(fDataHandle);    { Cast to array of longints.            }
  279.  
  280.     FOR i := 0 TO kMaxLong DO                        { Invert the bits 32 at a time.            }
  281.         iconAsLongArray^^[i] := BNOT(iconAsLongArray^^[i]);
  282. END;
  283.  
  284.  
  285.  
  286. {-------------------------------------------------------------------------------------------}
  287.  
  288. PROCEDURE TIconBitMap.IconBitToWordBit (iconBit: Point; VAR word, bit: INTEGER);
  289.     { This converts the given icon bit to a word and bit in an array of long words. }
  290.  
  291. VAR
  292.     bitNumber:        INTEGER;
  293.  
  294. BEGIN
  295.     bitNumber := iconBit.v * kIconVBits + iconBit.h;
  296.     word := bitNumber DIV 32;
  297.     bit := 31 - (bitNumber MOD 32);
  298. END;
  299.  
  300.  
  301.  
  302. {-------------------------------------------------------------------------------------------}
  303.  
  304. FUNCTION  TIconBitMap.GetBit (iconBit: Point): BOOLEAN;
  305.     { Returns the state of the given bit in the icon being drawn. }
  306.  
  307. VAR
  308.     word:            INTEGER;
  309.     bitInWord:        INTEGER;
  310.  
  311. BEGIN
  312.     IconBitToWordBit(iconBit, word, bitInWord);
  313.  
  314.     GetBit := BTst(LongArrayHdl(fDataHandle)^^[word], bitInWord);
  315. END;
  316.  
  317.  
  318.  
  319. {-------------------------------------------------------------------------------------------}
  320.  
  321. PROCEDURE TIconBitMap.SetBit (iconBit: Point; turnBitOn: BOOLEAN);
  322.     { Set the state of the given bit in the icon being drawn. }
  323.  
  324. VAR
  325.     word:            INTEGER;
  326.     bitInWord:        INTEGER;
  327.  
  328. BEGIN
  329.     IconBitToWordBit(iconBit, word, bitInWord);
  330.  
  331.     {$H-}                                            { So the compiler thinks this is unsafe.}
  332.     IF turnBitOn THEN
  333.         BSet(LongArrayHdl(fDataHandle)^^[word], bitInWord)
  334.     ELSE
  335.         BClr(LongArrayHdl(fDataHandle)^^[word], bitInWord);
  336.     {$H+}
  337. END;
  338.  
  339.  
  340.  
  341. {-------------------------------------------------------------------------------------------}
  342.  
  343. FUNCTION TIconBitMap.Copy: TIconBitMap;
  344.  
  345. VAR
  346.     copyOfIcon:        TIconBitMap;
  347.  
  348. BEGIN
  349.     New(copyOfIcon);                                { Create a TIcon object.                }
  350.     FailNIL(copyOfIcon);                            { Make sure we were successful.            }
  351.     copyOfIcon.IIconBitMap;                            { Initialize it.                        }
  352.     copyOfIcon.SetIconBitMap(fDataHandle);            { Copy the data.                        }
  353.     Copy := copyOfIcon;                                { Return a reference to the new handle.    }
  354. END;
  355.  
  356.  
  357.             
  358. {-------------------------------------------------------------------------------------------}
  359.  
  360. PROCEDURE TIconBitMap.Draw (area: Rect);
  361.  
  362. BEGIN
  363.     PlotIcon(area, fDataHandle);    
  364. END;
  365.  
  366.  
  367.  
  368. {-------------------------------------------------------------------------------------------}
  369.  
  370. PROCEDURE TIconBitMap.CopyDataTo (anIcon: TIconBitMap);
  371.  
  372. BEGIN
  373.     anIcon.SetIconBitMap(fDataHandle);                { Copy data to the new icon.            }
  374. END;
  375.  
  376.  
  377. {-------------------------------------------------------------------------------------------}
  378.  
  379. PROCEDURE TIconBitMap.Fields (PROCEDURE DoToField (fieldName: Str255;
  380.                                                    fieldAddr: Ptr;
  381.                                                    fieldType: INTEGER)); OVERRIDE;
  382.  
  383. BEGIN
  384.     DoToField('TIconBitMap', NIL, bClass);
  385.     DoToField('fDataHandle', @fDataHandle, bHandle);
  386.  
  387.     INHERITED Fields(DoToField);
  388. END;
  389.  
  390.